package reflex;

import java.lang.reflect.Method;

public class Test {

    public static void main(String[] args) throws Exception {
        Dog dog = new Dog();
//        dog.eat();
//        dog.play();
        Class dogClass = dog.getClass();  // 获取class对象方法一
        System.out.println(Dog.class);  // 获取class对象方法二

//        Class<?> dogClass = Class.forName("reflex.Dog");   // 获取class对象方法三
        System.out.println(dogClass);


        // 获取反射内容
        System.out.println(dogClass.getName());
        System.out.println(dogClass.getSimpleName());
        System.out.println(dogClass.getConstructors());
        System.out.println(dogClass.getDeclaredFields());   // 本类声明的所有字段属性，可以不是public属性
        System.out.println(dogClass.getDeclaredField("hobby"));
        System.out.println(dogClass.getFields());
        System.out.println(dogClass.getField("weight"));  // 必须是public属性
        System.out.println(dogClass.getMethods());   // 包含父类中的方法
        System.out.println(dogClass.getDeclaredMethods());   // 只包含本类中的方法

        // 利用反射调用方法
        Object obj = dogClass.newInstance();  // 通过class对象实例化一个类的对象
//        Dog dog1 = (Dog) obj;
//        dog1.play();

        // 利用反射调用方法
        Method method = dogClass.getMethod("sleep", int.class);
        Object result = method.invoke(obj, 5);  // 反射传参
        System.out.println(result);   // 获取反射调用方法返回的结果

    }
}
